package com.gitee.qdbp.general.common.api.oplog.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.gitee.qdbp.able.jdbc.paging.PartList;
import com.gitee.qdbp.base.annotation.DataIsolation;
import com.gitee.qdbp.base.annotation.OperateTraces;
import com.gitee.qdbp.general.common.enums.LogProcessState;
import com.gitee.qdbp.general.common.enums.LogRequestType;
import com.gitee.qdbp.general.common.enums.LogResultType;

/**
 * 操作记录实体类
 *
 * @author zhh
 * @version 180119
 */
@OperateTraces(enable = false)
@DataIsolation(enable = false)
public class OperateRecordBean implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 表名 **/
    public static final String TABLE = "sys_operate_record";

    /** 主键 **/
    private String id;

    /** 租户编号 **/
    private String tenantCode;

    /** 工程 **/
    private String project;

    /** 分组 **/
    private String groups;

    /** 用户ID **/
    private String userId;

    /** 用户名 **/
    private String userName;

    /** 商家租户编号 **/
    private String providerTenantCode;

    /** 客服租户编号 **/
    private String agentTenantCode;

    /** 客服ID **/
    private String agentId;

    /** 客服姓名 **/
    private String agentName;

    /** 是否代客操作 **/
    private Boolean agencyOperate;

    /** IP **/
    private String ip;

    /** 城市 **/
    private String city;

    /** 请求类型(1.页面|2.接口) **/
    private LogRequestType requestType;

    /** 请求协议 **/
    private String requestProtocol;

    /** 请求方法 **/
    private String requestMethod;

    /** 请求URL **/
    private String requestUrl;

    /** 请求参数 **/
    private String requestParams;

    /** 执行描述 **/
    private String executeDesc;

    /** 执行方法 **/
    private String executeMethod;

    /** 执行时间 **/
    private Integer executeTime;

    /** 调用DB次数 **/
    private Integer dbInvokeTimes;

    /** 结果类型(1.成功|2.失败|3.未知) **/
    private LogResultType returnType;

    /** 返回码 **/
    private String returnCode;

    /** 返回内容 **/
    private String returnContent;

    /** 来源页 **/
    private String refererUrl;

    /** 入口 **/
    private Boolean entrance;

    /** 来源类型 **/
    private String refererType;

    /** 来源关键词 **/
    private String refererKeyword;

    /** UserAgent **/
    private String userAgent;

    /** 浏览器类型 **/
    private String browserType;

    /** 浏览器版本 **/
    private String browserVersion;

    /** 操作系统类型 **/
    private String osType;

    /** 操作系统版本 **/
    private String osVersion;

    /** 设备类型 **/
    private String deviceType;

    /** 处理状态(1.未处理|2.已处理) **/
    private LogProcessState processState;

    /** 创建时间 **/
    private Date createTime;

    /** 选项 **/
    private OperateRecordOptions options;

    /** 获取主键 **/
    public String getId() {
        return id;
    }

    /** 设置主键 **/
    public void setId(String id) {
        this.id = id;
    }

    /** 获取租户编号 **/
    public String getTenantCode() {
        return tenantCode;
    }

    /** 设置租户编号 **/
    public void setTenantCode(String tenantCode) {
        this.tenantCode = tenantCode;
    }

    /** 获取工程 **/
    public String getProject() {
        return project;
    }

    /** 设置工程 **/
    public void setProject(String project) {
        this.project = project;
    }

    /** 获取分组 **/
    public String getGroups() {
        return groups;
    }

    /** 设置分组 **/
    public void setGroups(String groups) {
        this.groups = groups;
    }

    /** 获取用户ID **/
    public String getUserId() {
        return userId;
    }

    /** 设置用户ID **/
    public void setUserId(String userId) {
        this.userId = userId;
    }

    /** 获取用户名 **/
    public String getUserName() {
        return userName;
    }

    /** 设置用户名 **/
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /** 获取商家租户编号 **/
    public String getProviderTenantCode() {
        return providerTenantCode;
    }

    /** 设置商家租户编号 **/
    public void setProviderTenantCode(String providerTenantCode) {
        this.providerTenantCode = providerTenantCode;
    }

    /** 获取客服租户编号 **/
    public String getAgentTenantCode() {
        return agentTenantCode;
    }

    /** 设置客服租户编号 **/
    public void setAgentTenantCode(String agentTenantCode) {
        this.agentTenantCode = agentTenantCode;
    }

    /** 获取客服ID **/
    public String getAgentId() {
        return agentId;
    }

    /** 设置客服ID **/
    public void setAgentId(String agentId) {
        this.agentId = agentId;
    }

    /** 获取客服姓名 **/
    public String getAgentName() {
        return agentName;
    }

    /** 设置客服姓名 **/
    public void setAgentName(String agentName) {
        this.agentName = agentName;
    }

    /** 获取是否代客操作 **/
    public Boolean getAgencyOperate() {
        return agencyOperate;
    }

    /** 设置是否代客操作 **/
    public void setAgencyOperate(Boolean agencyOperate) {
        this.agencyOperate = agencyOperate;
    }

    /** 获取IP **/
    public String getIp() {
        return ip;
    }

    /** 设置IP **/
    public void setIp(String ip) {
        this.ip = ip;
    }

    /** 获取城市 **/
    public String getCity() {
        return city;
    }

    /** 设置城市 **/
    public void setCity(String city) {
        this.city = city;
    }

    /** 获取请求类型(1.页面|2.接口) **/
    public LogRequestType getRequestType() {
        return requestType;
    }

    /** 设置请求类型(1.页面|2.接口) **/
    public void setRequestType(LogRequestType requestType) {
        this.requestType = requestType;
    }

    /** 获取请求协议 **/
    public String getRequestProtocol() {
        return requestProtocol;
    }

    /** 设置请求协议 **/
    public void setRequestProtocol(String requestProtocol) {
        this.requestProtocol = requestProtocol;
    }

    /** 获取请求方法 **/
    public String getRequestMethod() {
        return requestMethod;
    }

    /** 设置请求方法 **/
    public void setRequestMethod(String requestMethod) {
        this.requestMethod = requestMethod;
    }

    /** 获取请求URL **/
    public String getRequestUrl() {
        return requestUrl;
    }

    /** 设置请求URL **/
    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    /** 获取请求参数 **/
    public String getRequestParams() {
        return requestParams;
    }

    /** 设置请求参数 **/
    public void setRequestParams(String requestParams) {
        this.requestParams = requestParams;
    }

    /** 获取执行描述 **/
    public String getExecuteDesc() {
        return executeDesc;
    }

    /** 设置执行描述 **/
    public void setExecuteDesc(String executeDesc) {
        this.executeDesc = executeDesc;
    }

    /** 获取执行方法 **/
    public String getExecuteMethod() {
        return executeMethod;
    }

    /** 设置执行方法 **/
    public void setExecuteMethod(String executeMethod) {
        this.executeMethod = executeMethod;
    }

    /** 获取执行时间 **/
    public Integer getExecuteTime() {
        return executeTime;
    }

    /** 设置执行时间 **/
    public void setExecuteTime(Integer executeTime) {
        this.executeTime = executeTime;
    }

    /** 获取调用DB次数 **/
    public Integer getDbInvokeTimes() {
        return dbInvokeTimes;
    }

    /** 设置调用DB次数 **/
    public void setDbInvokeTimes(Integer dbInvokeTimes) {
        this.dbInvokeTimes = dbInvokeTimes;
    }

    /** 获取结果类型(1.成功|2.失败|3.未知) **/
    public LogResultType getReturnType() {
        return returnType;
    }

    /** 设置结果类型(1.成功|2.失败|3.未知) **/
    public void setReturnType(LogResultType returnType) {
        this.returnType = returnType;
    }

    /** 获取返回码 **/
    public String getReturnCode() {
        return returnCode;
    }

    /** 设置返回码 **/
    public void setReturnCode(String returnCode) {
        this.returnCode = returnCode;
    }

    /** 获取返回内容 **/
    public String getReturnContent() {
        return returnContent;
    }

    /** 设置返回内容 **/
    public void setReturnContent(String returnContent) {
        this.returnContent = returnContent;
    }

    /** 获取来源页 **/
    public String getRefererUrl() {
        return refererUrl;
    }

    /** 设置来源页 **/
    public void setRefererUrl(String refererUrl) {
        this.refererUrl = refererUrl;
    }

    /** 获取入口 **/
    public Boolean getEntrance() {
        return entrance;
    }

    /** 设置入口 **/
    public void setEntrance(Boolean entrance) {
        this.entrance = entrance;
    }

    /** 获取来源类型 **/
    public String getRefererType() {
        return refererType;
    }

    /** 设置来源类型 **/
    public void setRefererType(String refererType) {
        this.refererType = refererType;
    }

    /** 获取来源关键词 **/
    public String getRefererKeyword() {
        return refererKeyword;
    }

    /** 设置来源关键词 **/
    public void setRefererKeyword(String refererKeyword) {
        this.refererKeyword = refererKeyword;
    }

    /** 获取UserAgent **/
    public String getUserAgent() {
        return userAgent;
    }

    /** 设置UserAgent **/
    public void setUserAgent(String userAgent) {
        this.userAgent = userAgent;
    }

    /** 获取浏览器类型 **/
    public String getBrowserType() {
        return browserType;
    }

    /** 设置浏览器类型 **/
    public void setBrowserType(String browserType) {
        this.browserType = browserType;
    }

    /** 获取浏览器版本 **/
    public String getBrowserVersion() {
        return browserVersion;
    }

    /** 设置浏览器版本 **/
    public void setBrowserVersion(String browserVersion) {
        this.browserVersion = browserVersion;
    }

    /** 获取操作系统类型 **/
    public String getOsType() {
        return osType;
    }

    /** 设置操作系统类型 **/
    public void setOsType(String osType) {
        this.osType = osType;
    }

    /** 获取操作系统版本 **/
    public String getOsVersion() {
        return osVersion;
    }

    /** 设置操作系统版本 **/
    public void setOsVersion(String osVersion) {
        this.osVersion = osVersion;
    }

    /** 获取设备类型 **/
    public String getDeviceType() {
        return deviceType;
    }

    /** 设置设备类型 **/
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }

    /** 获取处理状态(1.未处理|2.已处理) **/
    public LogProcessState getProcessState() {
        return processState;
    }

    /** 设置处理状态(1.未处理|2.已处理) **/
    public void setProcessState(LogProcessState processState) {
        this.processState = processState;
    }

    /** 获取创建时间 **/
    public Date getCreateTime() {
        return createTime;
    }

    /** 设置创建时间 **/
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /** 获取选项 **/
    public OperateRecordOptions getOptions() {
        return options;
    }

    /** 获取选项, force=是否强制返回非空对象 **/
    public OperateRecordOptions getOptions(boolean force) {
        if (options == null && force) {
            options = new OperateRecordOptions();
        }
        return options;
    }

    /** 设置选项 **/
    public void setOptions(OperateRecordOptions options) {
        this.options = options;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends OperateRecordBean> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setId(this.getId()); // 主键
        instance.setTenantCode(this.getTenantCode()); // 租户编号
        instance.setProject(this.getProject()); // 工程
        instance.setGroups(this.getGroups()); // 分组
        instance.setUserId(this.getUserId()); // 用户ID
        instance.setUserName(this.getUserName()); // 用户名
        instance.setProviderTenantCode(this.getProviderTenantCode()); // 商家租户编号
        instance.setAgentTenantCode(this.getAgentTenantCode()); // 客服租户编号
        instance.setAgentId(this.getAgentId()); // 客服ID
        instance.setAgentName(this.getAgentName()); // 客服姓名
        instance.setAgencyOperate(this.getAgencyOperate()); // 是否代客操作
        instance.setIp(this.getIp()); // IP
        instance.setCity(this.getCity()); // 城市
        instance.setRequestType(this.getRequestType()); // 请求类型(1.页面|2.接口)
        instance.setRequestProtocol(this.getRequestProtocol()); // 请求协议
        instance.setRequestMethod(this.getRequestMethod()); // 请求方法
        instance.setRequestUrl(this.getRequestUrl()); // 请求URL
        instance.setRequestParams(this.getRequestParams()); // 请求参数
        instance.setExecuteDesc(this.getExecuteDesc()); // 执行描述
        instance.setExecuteMethod(this.getExecuteMethod()); // 执行方法
        instance.setExecuteTime(this.getExecuteTime()); // 执行时间
        instance.setDbInvokeTimes(this.getDbInvokeTimes()); // 调用DB次数
        instance.setReturnType(this.getReturnType()); // 结果类型(1.成功|2.失败|3.未知)
        instance.setReturnCode(this.getReturnCode()); // 返回码
        instance.setReturnContent(this.getReturnContent()); // 返回内容
        instance.setRefererUrl(this.getRefererUrl()); // 来源页
        instance.setEntrance(this.getEntrance()); // 入口
        instance.setRefererType(this.getRefererType()); // 来源类型
        instance.setRefererKeyword(this.getRefererKeyword()); // 来源关键词
        instance.setUserAgent(this.getUserAgent()); // UserAgent
        instance.setBrowserType(this.getBrowserType()); // 浏览器类型
        instance.setBrowserVersion(this.getBrowserVersion()); // 浏览器版本
        instance.setOsType(this.getOsType()); // 操作系统类型
        instance.setOsVersion(this.getOsVersion()); // 操作系统版本
        instance.setDeviceType(this.getDeviceType()); // 设备类型
        instance.setProcessState(this.getProcessState()); // 处理状态(1.未处理|2.已处理)
        instance.setCreateTime(this.getCreateTime()); // 创建时间
        instance.setOptions(this.getOptions()); // 选项
        return instance;
    }

    /**
     * 将OperateRecordBean转换为子类对象
     *
     * @param beans 待转换的对象列表
     * @param clazz 目标类型
     * @param <T> OperateRecordBean或子类
     * @param <C> T的子类
     * @return 目标对象列表
     */
    public static <T extends OperateRecordBean, C extends T> List<C> to(List<T> beans, Class<C> clazz) {
        if (beans == null) {
            return null;
        }
        List<C> list;
        if (beans instanceof PartList) {
            PartList<C> partlist = new PartList<>();
            partlist.setTotal(((PartList<?>) beans).getTotal());
            list = partlist;
        } else {
            list = new ArrayList<>();
        }
        for (OperateRecordBean bean : beans) {
            list.add(bean.to(clazz));
        }
        return list;
    }

}